﻿#define _CRT_SECURE_NO_WARNINGS

//template <class ...Args>
//void Print(Args&&... args)
//{
//	cout << sizeof...(args) << endl;
//}
//
//int main()
//{
//	double x = 2.2;
//
//	Print(); // 包里有0个参数 
//	Print(1); // 包里有1个参数 
//	Print(1, string("xxxxx")); // 包里有2个参数 
//	Print(1.1, string("xxxxx"), x); // 包里有3个参数 
//
//	return 0;
//}

template <class T>
const T& GetArg(const T& x)
{
	cout << x << " ";
	return x;
}

template <class ...Args>
void Arguments(Args... args)
{}

template <class ...Args>
void Print(Args... args)
{
	// 注意GetArg必须返回或者到的对象，这样才能组成参数包给Arguments 
	Arguments(GetArg(args)...);
}

int main()
{
	Print(1, string("xxxxx"), 2.2);
	return 0;
}


// 本质可以理解为编译器编译时，包的扩展模式 
// 将上⾯的函数模板扩展实例化为下⾯的函数 
//void Print(int x, string y, double z)
//{
// Arguments(GetArg(x), GetArg(y), GetArg(z));
//}

